package malagaAcoge.controller.daos;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import malagaAcoge.model.entities.Abogado;
import malagaAcoge.utils.JPAUtils;

public class AbogadoDao {
	private static JPAUtils jpaUtils;
	protected static EntityManager em;

	public AbogadoDao() {
		jpaUtils = new JPAUtils();

	}

	@SuppressWarnings("unchecked")
	public static List<Abogado> findAll() {
		List<Abogado> abogados = new ArrayList<Abogado>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em.createQuery("select a from Abogado a");
			abogados = q.getResultList();
		} catch (Exception e) {
			System.out.println("Error en metodo findAllAbogado");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return abogados;

	}

	public static List<Abogado> findAbogadoByName(String query) {
		List<Abogado> abogados = new ArrayList<Abogado>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em
					.createQuery(
							"SELECT OBJECT(Abogado) FROM Abogado abogado WHERE abogado.nombre like :valor or abogado.apellidos like :valor")
					.setParameter("valor", "%"+query+"%");
			abogados = q.getResultList();
		} catch (Exception e) {
			System.out.println("Error en metodo findAllAbogado");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return abogados;

	}

	public static Abogado findAbogado(int id) {
		Abogado abogado = null;
		try {
			em = jpaUtils.getEntityManager();
			abogado = (Abogado) em.find(Abogado.class, id);
		} catch (Exception e) {
			System.out.println("Error en metodo findAbogado");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return abogado;

	}

	public static void createAbogado(Abogado abogado) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.persist(abogado);
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println("Error en metodo createAbogado:");
			e.printStackTrace();
		} finally {
			em.close();
		}

	}

	public static void updateAbogado(Abogado abogado) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.merge(abogado);
			em.getTransaction().commit();

		} catch (Exception e) {
			System.out.println("Error en metodo updateAbogado:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	public static void deleteAbogado(int idAbogado) {
		try {
			em = jpaUtils.getEntityManager();
			Abogado abogado = em.find(Abogado.class, idAbogado);
			if (abogado != null) {
				em.getTransaction().begin();
				em.remove(abogado);
				em.getTransaction().commit();
			}
		} catch (Exception e) {
			System.out.println("Error en metodo deleteAbogado:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}


	public static Abogado findAbogadoByExactName(String nombreAbogado) {
		Abogado abogado = null;
		try {
			em = jpaUtils.getEntityManager();
			Query q = em
					.createQuery(
							"SELECT OBJECT(Abogado) FROM Abogado abogado WHERE concat(abogado.nombre,' ',abogado.apellidos) like :valor")
					.setParameter("valor", nombreAbogado);
			abogado = (Abogado) q.getSingleResult();
		}catch (NoResultException e) {
			System.out.println("No hay abogados con este criterio.");
		} catch (Exception e) {
			System.out.println("Error en metodo findAbogadoByExactName");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return abogado;
	}
}
